# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.shortcuts import render

# Create your views here.
from rest_framework.response import Response
from users.utils import generic_verify_url, check_active_token
from rest_framework.views import APIView
# from .models import User
from users.models import User
from rest_framework.generics import GenericAPIView
class RegisterUsernameCountAPIView(GenericAPIView):

    def get(self,request,username):
        count = User.objects.filter(username=username).count()

        data = {
            'count':count,
            'username':username
        }
        return Response(data)


from .serializers import RegisterUserSerializer, UserCenterInfoSerializer, EmailUpdateSerializer, \
    AddressesCreateSerializer
# class RegisterUserAPIView(APIView):
#
#     def post(self,request):
#         # 1.接收数据（用户名，手机号，密码，短信验证码，确认密码和是否同意协议）
#         data = request.data
#         # 2.验证数据
#         serializer = RegisterUserSerializer(data=data)
#         serializer.is_valid()
#         # 3.数据入库
#         # 当我们调用序列化器的save方法的时候，序列化器会调用 create方法
#         # 以下代码分析出现了问题
#         # instance = User.objects.create(**validated_data)
#         # validated_data 当我们的验证数据满足条件的时候
#         # validated_data = data
#         # data = {
#         #       'usenrmae':xxx,
#         #       'password':xxx,
#         #       'password2':xxx
#         #
#         # }
#         # 调用序列化器的方法
#         user = serializer.save()
#         # 4.返回相应
#         # serializer.data
#         # 在进行序列化
#         # 序列化 --> 将模型转换为字典
#         # 将模型转换为字典，序列化器是如何实现的？
#         # 序列化器就是通过 自己的字段 来获取 对应的模型的属性的数据
#
#         # 生成token
#         from rest_framework_jwt.settings import api_settings
#
#         jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
#         jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
#
#         payload = jwt_payload_handler(user)
#         token = jwt_encode_handler(payload)
#
#         # 将token返回回去
#         data = serializer.data
#         data['token'] = token
#
#         return Response(data)
#
#         # # 1.接收数据（用户名，手机号，密码，短信验证码，确认密码和是否同意协议）
#         # data = request.data
#         # username = data.get('username')
#         # password=data.get('password')
#         # password2=data.get('password2')
#         #
#         # # 2.验证数据
#         # if not all([username,password,password2]):
#         #     pass
#         #
#         # if password2 != password:
#         #     pass
#         #
#         # # 3.数据入库
#         # user = User.objects.create(**data)
#         # # 4.返回响应
#         # return Response({'username':user.username})
#
#         # 404 路由设置有问题
#         # 500 代码哪里有问题，加断点 + dubug模式
#         # 405 方法不被允许


from rest_framework.generics import GenericAPIView
from rest_framework.mixins import CreateModelMixin

# class RegisterUserAPIView(CreateModelMixin,GenericAPIView):
#
#     serializer_class = RegisterUserSerializer
#
#     # 新增数据 我们只是验证数据，将对象转换为字典
#     # 不需要查询其他的数据，所以这里不需要设置 queryset 属性
#
#     # queryset = User.objects.all()
#
#     def post(self,request):
#
#         return self.create(request)

from rest_framework.generics import CreateAPIView
class RegisterUserAPIView(CreateAPIView):

    serializer_class = RegisterUserSerializer

# 注册完成之后自动登陆

# from users.serializers import RegisterUserSerializer
#
# from django.contrib.auth.backends import ModelBackend


"""
个人中心

需求： 必须是登陆用户才可以显示个人中心，而且是 需要让前端将用户信息传递过来的

认证方式采用的JWT
我们让前端把token传递过来
后端：
    一，大体的步骤
    1.接收用户信息
    2.根据用户信息进行查询（user）
    3.将user对象转换为字典，返回
    二，确定请求方式
    GET     /users/infos/

    三，选择视图
        APIView                     ：  DRF的基类
        GeneriAPIView               ： 对列表视图和详情视图做了通用支持，一般和Mixin配合使用
        ListAPIView,RetrieveAPIView  :  连get方法都不用写，自动调用系统的mixin实现增删改查
    四。按照步骤开发

"""
from rest_framework.mixins import RetrieveModelMixin
from rest_framework.permissions import IsAuthenticated
# class UserCenterInfoAPIView(APIView):
#
#     # 这个接口 只能是登陆用户才能访问
#     permission_classes = [IsAuthenticated]
#
#     def get(self,request,id):
#
#         #1. 接收用户信息
#         # 在这里 结合用户权限 我们就获取到了 用户信息
#         user = request.user
#         #2. 将对象转换为字典
#         serializer = UserCenterInfoSerializer(user)
#         #3. 返回数据
#         return Response(serializer.data)

from rest_framework.generics import RetrieveAPIView

class UserCenterInfoAPIView(RetrieveAPIView):


    permission_classes = [IsAuthenticated]

    serializer_class = UserCenterInfoSerializer

    # 重写 Mixin扩展中的 get_object 方法
    def get_object(self):

        return self.request.user

    # queryset = User.objects.all()

"""
邮箱的 逻辑

当用户输入邮箱之后，点击保存，这个时候，前端需要将 邮箱发送给后端

后端：
    1.接收邮箱信息
    2.保存邮箱信息到数据库中
    3.发送一封激活邮件
    4.用户点击激活邮件的时候，我们需要修改邮件的标记位 ，由未激活变为已激活

"""


"""
一，更新邮箱的逻辑是：
    1.让前端将邮箱以及token传递给后端
    2.后端接收数据
    3.更新指定用户的信息
    4.返回响应
二，请求的路由和方式
    PUT     /users/emails/          put传递的数据在 请求的body中

三，选择视图
    APIView                     ：  DRF的基类
    GeneriAPIView               ： 对列表视图和详情视图做了通用支持，一般和Mixin配合使用
    UpdateAPIView                 :  连put方法都不用写，自动调用系统的mixin实现增删改查
四。按照步骤开发

"""
class EmailUpdateAPIView(APIView):

    permission_classes = [IsAuthenticated]

    def put(self,request):
        # 1.让前端将邮箱以及token传递给后端
        # 2.后端接收数据
        data = request.data
        # 3.更新指定用户的信息
        user = request.user

        serializer = EmailUpdateSerializer(instance=user,data=data)
        serializer.is_valid(raise_exception=True)

        serializer.save()

        # 发送激活邮件
        # ① 如何发送邮件
        # ② 发送邮件的内容

        from django.core.mail import send_mail
        #subject, message, from_email, recipient_list,
        #subject,       主题
        subject = '美多商场激活邮件'
        #  message,     信息
        message = ''
        # from_email,   发件人
        from_email = '美多商城<qi_rui_hua@163.com>'
        # recipient_list,   收件人列表
        email = request.data.get('email')
        recipient_list = [email]

        verify_url = generic_verify_url(request.user.id,email)

        html_message = '<p>尊敬的用户您好！</p>' \
                       '<p>感谢您使用美多商城。</p>' \
                       '<p>您的邮箱为：%s 。请点击此链接激活您的邮箱：</p>' \
                       '<p><a href="%s">%s<a></p>' % (email, verify_url, verify_url)

        # send_mail(subject=subject,
        #           message=message,
        #           from_email=from_email,
        #           recipient_list=recipient_list,
        #           html_message=html_message)


        from celery_tasks.email.tasks import send_active_email

        send_active_email.delay(subject=subject,
                                message=message,
                                from_email=from_email,
                                recipient_list=recipient_list,
                                html_message=html_message)

        # 4.返回响应
        return Response(serializer.data)

"""
需求：
    当用户点击激活连接的时候，会跳转到一个激活页面，这个激活页面需要让前端将token传递给后端

后端：
    一。大体步骤写下来
        1.接收token
        2.验证token
        3.根据验证之后的数据进行查询
        4.修改用户的激活状态
        5.返回相应

    二。请求方式和路由
        GET     users/email/verifications/?token=xxxx

    三。确定视图

    四。按照步骤开发

"""
from rest_framework import status
class EmailVerificationAPIView(APIView):

    def get(self,request):
        # 1.接收token
        token = request.query_params.get('token')
        if token is None:

            return Response(status=status.HTTP_400_BAD_REQUEST)
        # 2.验证token
        data = check_active_token(token)
        if data is None:
            return Response(status=status.HTTP_400_BAD_REQUEST)
        # 3.根据验证之后的数据进行查询
        user_id = data.get('user_id')
        email=data.get('email')
        # and
        # filter().filter()
        # filter(,,,,)
        try:
            user = User.objects.get(id=user_id,email=email)
        except User.DoesNotExist:
            return Response(status=status.HTTP_400_BAD_REQUEST)
        # 4.修改用户的激活状态
        user.email_active=True
        user.save()
        # 5.返回相应
        return Response({'msg':'ok'})


"""
地址管理
新增地址：

当用户将新增地址数据，填写完成之后，需要让前端收集数据
我们可以让前端将 用户id传递过来，但是我们讲的时候，让前端将token传递过来

用户token，收件人，地址，电话，省，市，区，固定电话，邮箱发送给后端

后端：
    1.接收数据
    2.验证数据
    3.数据入库
    4.返回相应

    POST    /users/addresses/

    CreateAPIView
"""
from rest_framework.generics import CreateAPIView
# class AddressesCreateAPIView(CreateAPIView):
#
#     serializer_class =
#     pass


class AddressesCreateAPIView(APIView):

    permission_classes = [IsAuthenticated]

    def post(self,request):
        # request.user

        # 1.接收数据
        # request.data 是没有 user信息的
        data = request.data
        # data['user']=request.user

        # 2.验证数据
        serializer = AddressesCreateSerializer(data=data,context={'request':request})
        # 3.数据入库
        serializer.is_valid(raise_exception=True)
        serializer.save()
        # 4.返回相应
        return Response(serializer.data)
